package cn.learn.activiti.service;

import cn.learn.activiti.domain.ActNodeConfig;
import org.activiti.api.runtime.shared.query.Page;
import org.activiti.api.task.model.Task;

import java.util.List;

/**
 * 操作任务实例
 *
 * @author huangyezhan
 * @version 1.0
 * @date 2021年03月11日18:06
 */
public interface ITaskService {

    /**
     * 分页待处理任务
     *
     * @param startIndex    开始索引
     * @param maxItems      最大条数
     * @param authorization 授权凭证
     * @return 返回结果
     */
    Page<Task> waiting4Task(Integer startIndex, Integer maxItems, String authorization);

    /**
     * 根据业务ID获取待处理的任务
     *
     * @param businessKey 业务ID
     * @return 返回结果
     */
    List<org.activiti.engine.task.Task> getTasksByBusinessKey(String businessKey);

    /**
     * 处理任务
     *
     * @param taskId        任务id
     * @param authorization 授权凭证
     * @return 返回结果
     */
    Task completeTask(String taskId, String authorization, ActNodeConfig actNodeConfig);

    /**
     * 拾取任务
     * 已经拾取跟未拾取的任务，status状态不一样
     * status=CREATED未拾取
     * status=ASSIGNED拾取
     * <br/>
     * Assignee、Candidate User、Candidate Groups都指定了
     * 要去掉Assignee，候选组才能生效Candidate User、Candidate Groups
     * 去掉的Assignee也可以从新拾取该任务
     *
     * @param taskId        任务id
     * @param authorization 授权凭证
     * @return 返回结果
     */
    Task claim(String taskId, String authorization);

    /**
     * 退回任务
     * 即设置Assignee为null
     *
     * @param taskId 任务id
     */
    void sendBackTask(String taskId);

    /**
     * 转派任务
     * 可以不退回任务，直接转派任务给其他候选人
     *
     * @param taskId 任务id
     * @param userId 转让人
     */
    void assignmentAssignee(String taskId, String userId);

    /**
     * 回退任务
     *
     * @param currentTaskId 当前节点的任务ID
     */
    void rollbackTask(String currentTaskId);

    /**
     * 撤回任务
     *
     * @param currentHistoryTaskId 当前的历史任务ID
     */
    void withdrawTask(String currentHistoryTaskId);

}
